package com.example.jvm_lecture.classloader;

/**
 * @Author: 蔡翔
 * @Date: 2020/4/25 20:01
 * @Version 1.0
 * 常量在编译阶段会存入到调用这个常量的方法所在类的常量池中
 * 本质上，调用类并没有直接引用到 定义常量的类，因此并不会触发定义常量 类的初始化
 * 注意：这里指的是将常量存放到MyTest2的常量池中，之后MyTest2与MyParent2就没有任何关系了。
 * 甚至，我们可以将MyParent2的class文件删除
 */

/**
 * 反编译的时候      javap -c MyTest2
 * 助记符
 *          ldc：表示将int，float或是String类型 的常量值从常量池中推送至  栈顶（就是马上要去用的）
 *          bipush ：表示将单字节（-128 - 127）的常量值推送至栈顶
 *          sipush : 表示将一个短整型常量值（-32768 - 32767） 推送至栈顶
 *          iconst_1 : 表示将int 类型的数字 1 推送至栈顶 ( iconst_1 - iconst_5 )
 * */
public class MyTest2 {
    public static void main(String[] args) {
        /**
         * 加了final 以后
         *  结果：hello word    //因为final是不可变的所以，这个常量是存储在调用这个常量的方法 所在那个类的常量池中（这里也就是MyTest2 的常量池中）
         *
         * */
        System.out.println(MyParent2.i);
    }
}

class MyParent2{
    public static final String str = "hello word";
    public static final short s = 127;
    public static final int i = 1;

    static {
        System.out.println("MyParent2 static block");
    }
}
